﻿/**********************************************************
 ●项目：Smartkernel
 ●公司：智能核心信息技术研发中心
 ●作者：曹艳白
 ●邮箱：caoyanbai@gmail.com
 ●创建：2008-08-10
 ●版本：1.0
**********************************************************/
using System.Configuration;
using System.Linq;
using Smartkernel.Caching;
using Smartkernel.Exceptions;
using Smartkernel.Extensions;
using Smartkernel.Resource;

namespace Smartkernel.Configuration
{
    /// <summary>
    /// 应用程序配置文件的操作，CS、BS架构都可以使用。没有限制。
    /// </summary>
    public static partial class SmartConfiger
    {
        #region 公有方法
        /// <summary>
        /// 根据键获得应用程序配置文件中AppSettings节点的值
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="key">键，不区分大小写</param>
        /// <param name="isCache">是否使用缓存方法</param>
        /// <returns>键所对应的值</returns>
        public static T GetAppSettingValue<T>(string key, bool isCache)
        {
            object value = null;
            if (isCache)
            {
                string category = "__SmartConfiger__ConfigFile";
                if (SmartMemoryCacher.ContainsKey(category, key))
                {
                    value = SmartMemoryCacher.GetValue(category, key);
                }
                else
                {
                    value = GetAppSettingValue<T>(key);
                    SmartMemoryCacher.Add(category, key, value);
                }
            }
            else
            {
                value = GetAppSettingValue<T>(key);
            }
            return (T)value;
        }
        #endregion
    }
    public static partial class SmartConfiger
    {
        #region 私有方法
        /// <summary>
        /// 根据键获得应用程序配置文件中AppSettings节点的值
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="key">键，不区分大小写</param>
        /// <returns>键所对应的值</returns>
        private static T GetAppSettingValue<T>(string key)
        {
            if (key.IsNullOrEmptyOrBlank())
            {
                throw new SmartException(SmartExceptionMessageResource.SmartConfiger_key_NullOrEmptyOrBlank);
            }

            var linq = from item in ConfigurationManager.AppSettings.AllKeys where item.ToLower() == key.ToLower() select item;
            if (linq.Count() > 0)
            {
                return SmartReflection.ConvertTo<T>(ConfigurationManager.AppSettings[linq.First()]);
            }
            else
            {
                throw new SmartException(SmartExceptionMessageResource.SmartConfiger_key_NotExists);
            }
        }
        #endregion
    }
}
